// modules/wechat.js
const axios = require('axios');
const pool = require('../db');

/**
 * 处理微信公众号消息
 * @param {Object} message - 微信消息对象
 * @returns {Promise<Object>} - 回复消息对象
 */
async function handleWechatMessage(message) {
  try {
    // 提取用户发送的消息内容
    const { Content, FromUserName, ToUserName, MsgType } = message;
    
    // 只处理文本消息
    if (MsgType !== 'text') {
      return createTextReply(FromUserName, ToUserName, '目前只支持文本消息查询哦~');
    }
    
    // 在数据库中查询匹配的游戏
    const matchedGames = await searchGamesInDatabase(Content);
    
    // 根据查询结果生成回复
    if (matchedGames && matchedGames.total > 0) {
      return createGameReply(FromUserName, ToUserName, matchedGames);
    } else {
      return createTextReply(FromUserName, ToUserName, '抱歉，没有找到相关资源，请尝试其他关键词~');
    }
  } catch (error) {
    console.error('处理微信消息出错:', error);
    return {
      error: true,
      message: '处理消息时发生错误'
    };
  }
}

/**
 * 在数据库中搜索匹配的游戏
 * @param {string} keyword - 搜索关键词
 * @returns {Promise<Array>} - 匹配的游戏列表
 */
async function searchGamesInDatabase(keyword) {
  return new Promise((resolve, reject) => {
    const query = `SELECT COUNT(*) as total FROM wechat_agents.games WHERE title LIKE ?`;
    pool.query(query, [`%${keyword}%`], (error, results) => {
      if (error) {
        console.error('数据库查询出错:', error);
        reject(error);
      } else {
        resolve({ total: results[0].total, keyword: keyword });
      }
    });
  });
}

/**
 * 创建文本回复
 * @param {string} toUser - 接收者OpenID
 * @param {string} fromUser - 发送者OpenID
 * @param {string} content - 回复内容
 * @returns {Object} - 回复消息对象
 */
function createTextReply(toUser, fromUser, content) {
  const timestamp = Math.floor(Date.now() / 1000);
  return {
    ToUserName: toUser,
    FromUserName: fromUser,
    CreateTime: timestamp,
    MsgType: 'text',
    Content: content
  };
}

/**
 * 创建游戏资源回复（图文消息格式）
 * @param {string} toUser - 接收者OpenID
 * @param {string} fromUser - 发送者OpenID
 * @param {Array} games - 游戏列表
 * @returns {Object} - 回复消息对象
 */
function createGameReply(toUser, fromUser, games) {
  console.log('处理文本消息', games);
  const timestamp = Math.floor(Date.now() / 1000);
  
  // 生成简洁的回复消息，只包含匹配数量和跳转链接
  const content = `找到${games.total}款相关游戏\n点击进入: <a data-miniprogram-appid="${process.env.APP_ID}" data-miniprogram-path="resourcePages/search/search?title=${games.keyword}">获取资源</a>`;
  
  return {
    ToUserName: toUser,
    FromUserName: fromUser,
    CreateTime: timestamp,
    MsgType: 'text',
    Content: content
  };
}

/**
 * 验证微信服务器签名
 * @param {Object} query - 请求参数
 * @returns {boolean} - 验证结果
 */
function verifySignature(query) {
  const crypto = require('crypto');
  const token = process.env.MINI_PROGRAM_MBTI_TOKEN; // 使用环境变量中的token
  const { signature, timestamp, nonce } = query;
  
  if (!signature || !timestamp || !nonce || !token) {
    return false;
  }
  
  // 1. 将token、timestamp、nonce三个参数进行字典序排序
  const arr = [token, timestamp, nonce].sort();
  
  // 2. 将三个参数字符串拼接成一个字符串进行sha1加密
  const str = arr.join('');
  const sha1 = crypto.createHash('sha1');
  sha1.update(str);
  const generatedSignature = sha1.digest('hex');
  
  // 3. 开发者获得加密后的字符串可与signature对比，标识该请求来源于微信
  return generatedSignature === signature;
}

module.exports = {
  handleWechatMessage,
  verifySignature
};